package server.services;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;
import javax.swing.Timer;

import server.Servidor;
import server.exception.ClientAcceptException;
import server.exception.ServerConnectException;
import server.exception.ServiceException;

public class ServerService {
	private static Servidor servidor;
	private static final int STOP_TIME = 10;
	private static final String MOTIVO_PREFIX = "Se detendra el servidor en " + STOP_TIME + " segundos" +
												"\nMotivo del corte de servicio:\n";

	public boolean iniciar(final int puerto) throws ServiceException {
		try {
			System.out.println("Iniciando servicio");
			System.out.println("Puerto "+ puerto);
			Thread t = new Thread(new Runnable() {
				public void run() {
					try {
						getServidor().start(puerto);
					} catch (ServerConnectException e) {
						e.printStackTrace();
						JOptionPane.showMessageDialog(null, 
								"No se ha podido iniciar el servicio\n" + e.getMessage(),
								"Error al iniciar el servicio", 
								JOptionPane.ERROR_MESSAGE);
					} catch (ClientAcceptException e) {
					}
				}
			});
			t.start();
			return true;
		} catch (Exception e) {
			throw new ServiceException("No pudo iniciarse el servicio", e);
		}
	}

	public boolean parar(final String motivo) throws ServiceException {
		try {
        	System.out.println("Parando servicio");
        	System.out.println(MOTIVO_PREFIX + motivo);
        	Servidor.enviarMensajeAConectados(MOTIVO_PREFIX+motivo);
        	
			Timer t = new Timer(STOP_TIME * 1000, new ActionListener() {
				public void actionPerformed(ActionEvent paramActionEvent) {
					try {
						getServidor().stop();
						System.out.println("Servicio parado");
					} catch (Exception e) {
						e.printStackTrace();
						JOptionPane.showMessageDialog(null, 
								"No se ha podido parar el servicio\n" + e.getMessage(),
								"Error al parar el servicio", 
								JOptionPane.ERROR_MESSAGE);
					}
				}
			});
			t.start();
			return true;
		} catch (Exception e) {
			throw new ServiceException("No se pudo parar el servicio", e);
		}
	}

	public int getPuerto() {
		return getServidor().getPuerto();
	}
	
	public boolean isActivo() {
		return getServidor().isActive();
	}

	private Servidor getServidor() {
		if (servidor == null)
			servidor = new Servidor();
		return servidor;
	}

	public void reiniciar(String motivo) throws ServiceException {
		System.out.println("Reiniciando servicio");
    	int puerto = this.getPuerto();
    	this.parar("Reinicio de servicio");
    	this.iniciar(puerto);
	}
}
